package com.cn.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class TestFilter extends ZuulFilter {

    @Override
    public String filterType() {
        //filterType()，表示过滤器的类型
        return "pre";
        /**
         * “pre”表示过滤器类型
         * zuul中定义了四种不同生命周期的过滤器类型：
         * pre:可以在请求被之前调用
         * route:在路由请求时候被调用
         * post:在route和error过滤器之后被调用
         * error:处理请求时发生错误时被调用
         */
    }

    @Override
    public int filterOrder() {
        //filterOrder()，表示过滤器的执行顺序，也就是说zuul过滤器可以有多个
        //第一个执行的过滤器就返回0，第二个执行就返回1，以此类推（返回的数字是int类型的）
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        //shouldFilter()，通过返回boolean类型来判断此顾虑器是否要执行。
        //true:表示执行
        //false:表示不执行
        //可以写一些逻辑判断来决定时候执行此过滤器，当然也可以直接返回true，在任何情况下都要执行。
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        //run(),的作用是：当过滤生效后，过滤的具体条件便是在此方法完成
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletResponse response = requestContext.getResponse();
        response.setContentType("application/json;charset=UTF-8");
        HttpServletRequest request = requestContext.getRequest();
        String uri = request.getRequestURI();

        //那些路径可以直接放行
//        boolean a = pathList.stream().anyMatch(path -> StringUtils.contains(uri, path));
//        if (a) {
//            return null;//表示放行
//        }

//        PathMatcher

//        String authorization = request.getHeader("Authorization"); // bearer jwtToken
//        if (StringUtils.isBlank(authorization)) {
////            requestContext.setResponseBody("未获取到token");
//            requestContext.setResponseBody(JSONObject.toJSONString(CommonResult.forbidden("未获取到token")));
//            requestContext.setSendZuulResponse(false);
//            return null;
//
//        }
//        String token = StringUtils.substring(authorization, "bearer".length()).trim();

        // 验证权限第一种方法：本地验证(简单的认证)
//        checkLocal(token,requestContext,uri);

        // 第二种方法：远程调用验证(复杂的认证)
//        checkLongRange(token, requestContext, uri);

        return null;
    }



    // 验证权限第一种方法：本地验证(不能实时刷新权限)
//    private Object checkLocal(String token, RequestContext requestContext, String uri) {
//        Set<String> auths = null; // 就是用户拥有的 uriList
//
//        try {
//            auths = jwtTokenUtil.getAuthsFromToken(token);
//        } catch (Exception e) {
//            // 处理token过期
//            if (e instanceof ExpiredJwtException) {
//                requestContext.setResponseBody("token 过期");
//                requestContext.setSendZuulResponse(false);
//                return null;
//            }
//            e.printStackTrace();
//        }
//        //验证权限
//        boolean b = auths.stream().anyMatch(auth -> StringUtils.equals(auth, uri));
//        if (!b) {
//            requestContext.setResponseBody("您没有权限");
//            requestContext.setSendZuulResponse(false);
//            return null;
//        }
//        return null;
//    }

    // 第二种方法：远程调用验证(复杂的认证)
//    private Object checkLongRange(String token, RequestContext requestContext, String uri) {
//        try {
//            boolean tokenExpired = jwtTokenUtil.isTokenExpired(token);
//            if (tokenExpired) {
//                requestContext.setResponseBody("token 过期");
//                requestContext.setSendZuulResponse(false);
//                return null;
//            }
//        } catch (Exception e) {
//            // 处理token过期
//            if (e instanceof ExpiredJwtException) {
//                requestContext.setResponseBody("token 过期");
//                requestContext.setSendZuulResponse(false);
//                return null;
//            }
//            e.printStackTrace();
//        }
//        CommonResult commonResult = authFeign.checkAccessToUri(uri, jwtTokenUtil.getUserNameFromToken(token));
//        if (commonResult.getCode() == 200) {
//            return null;
//        } else if (commonResult.getCode() == 403) {
//            requestContext.setResponseBody(JSONObject.toJSONString(CommonResult.forbidden(null)));
//            requestContext.setSendZuulResponse(false);
//            return null;
//        } else if (commonResult.getCode() == 500) {
//            requestContext.setResponseBody(JSONObject.toJSONString(CommonResult.failed("未知异常")));
//            requestContext.setSendZuulResponse(false);
//            return null;
//        } else {
//            requestContext.setResponseBody("未知的远程调用状态码");
//            requestContext.setSendZuulResponse(false);
//            return null;
//        }
//    }

}